package com.weimob.mcloud.wechatwork.customer.service;

import com.weimob.mcloud.wechatwork.core.adapter.pojo.dto.channel.response.SelfExternalContactGetBO;
import com.weimob.mcloud.wechatwork.core.entity.privatesphere.PrivateSphere;
import com.weimob.mcloud.wechatwork.customer.service.user.module.bo.tag.CustomerMarkTagFailBO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.bo.tag.MarkTagInfoBO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.bo.tag.TagBO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.bo.tag.TagItemBO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.dto.customer.ExternalUserInfoFindDTO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.dto.customer.MarkTagInfoDTO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.dto.tag.CustomerTagDTO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.req.tag.CustomerTagQueryDTO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.req.tag.MarkTagDTO;
import com.weimob.mcloud.wechatwork.customer.service.user.module.req.tag.TagQueryDTO;
import com.weimob.soa.common.response.SoaResponse;

import java.util.List;

/**
 * @author junlong.lv
 * @version 1.0
 * @date 2021/10/26 7:01 下午
 */
public interface TagManageService {

    /**
     * 查询产品实例id下面所有的标签
     * 并按照标签来源进行分类
     * @param tagQueryBOReq
     * @return
     */
    TagItemBO queryTagByProductInstanceId(TagQueryDTO tagQueryBOReq);

    /**
     *
     * @param customerTagQueryDTO
     * @return
     */
    List<TagBO> queryCustomerTag(CustomerTagQueryDTO customerTagQueryDTO);

    /**
     * 给客户打标
     * 打标签/移除标签
     * @param markTagBOReq
     * @return
     */
    SoaResponse<Boolean, ?> markTag(MarkTagDTO markTagBOReq);

    /**
     * 添加客户标签
     * 必须交验删除
     * 1、校验客户不能为空
     * 2、员工可以为空串，因为有些渠道打的标签是拿不到员工id的
     * 3、校验标签不能为空
     * 4、校验标签组不能为空
     * @param customerTagDTO
     * @return
     */
    SoaResponse<Boolean, ?> addCustomerTag(CustomerTagDTO customerTagDTO);

    /**
     * 移除客户标签
     * @return
     */
    SoaResponse<Boolean, ?> removeCustomerTag(CustomerTagDTO customerTagDTO, Boolean manualMark);


    Boolean initTag(PrivateSphere privateSphere, Boolean syncAllBosId);

    /**
     * 初始化外部联系人标签
     * @param privateSphere
     * @param externalUserId
     * @return
     */
    Boolean initCustomerTag(PrivateSphere privateSphere, String externalUserId, SelfExternalContactGetBO selfExternalContactGetBO);

    Boolean batchMarkTag(ExternalUserInfoFindDTO externalUserInfoListDTO);

    Boolean batchRemoveTag(ExternalUserInfoFindDTO externalUserInfoListDTO);

    MarkTagInfoBO queryMarkTagInfo(MarkTagInfoDTO markTagInfoDTO);

    Boolean readMarkTagInfo(MarkTagInfoDTO markTagInfoDTO);

    Boolean exportMarkTagFail(MarkTagInfoDTO markTagInfoDTO);

    Long count(MarkTagInfoDTO markTagInfoDTO);

    List<CustomerMarkTagFailBO> queryMarkTagFailInfoExport(MarkTagInfoDTO markTagInfoDTO);

}
